package cn.hanfeng.taskservice.scheduled;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * @author hanfeng 2020/8/28 10:16
 * @version 0.0.1
 */
@Component
public class SoutTask {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Scheduled(cron = "-")
    public void sout() throws InterruptedException {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        logger.info("我是定时任务" + sf.format(new Date()));
    }

    /**
     * 延迟定时任务
     * <p>
     * ps: spring cron任务是非延迟定时任务, 延迟了一律不执行
     * <pre>
     *     若延迟执行, 那么
     *     0:  2020-08-28 11:01:15
     *     10: 2020-08-28 11:01:25
     *     20: 2020-08-28 11:01:35
     *
     *     实际执行结果:
     *     我是定时任务-延迟5s: 2020-08-28 11:01:15
     *     我是定时任务-延迟5s: 2020-08-28 11:01:35
     * </pre>
     */

    // @Scheduled(cron = "0/10 * * * * ?")
    @Scheduled(cron = "-")
    public void delaySout() throws InterruptedException {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        TimeUnit.SECONDS.sleep(15);
        logger.info("我是定时任务-延迟5s: " + sf.format(new Date()));
    }

    /**
     * 注解声明式使用 - 延迟一秒开始执行，每隔5秒执行一次
     * <pre>
     *     预计执行结果:
     *      2020-08-31 04:25:01
     *      2020-08-31 04:25:06
     *      2020-08-31 04:25:11
     *      2020-08-31 04:25:16
     *     实际执行结果:
     *      我是定时任务-延迟15s执行每隔5s/次任务: 2020-08-31 04:25:01
     *      我是定时任务-延迟15s执行每隔5s/次任务: 2020-08-31 04:25:16
     *      我是定时任务-延迟15s执行每隔5s/次任务: 2020-08-31 04:25:31
     *      我是定时任务-延迟15s执行每隔5s/次任务: 2020-08-31 04:25:46
     *
     *     结论:上个任务如果占用下个任务的时间, 那么下个任务是不会启动的
     * </pre>
     */
//    @Scheduled(fixedRate = 5000, initialDelay = 1000)
    public void delayFixedRate () throws InterruptedException{
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        logger.info("我是定时任务-延迟15s执行每隔5s/次任务: " + sf.format(new Date()));
        TimeUnit.SECONDS.sleep(15);
    }
}
